// Copyright (C) 2022 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
//
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<广西木子科技有限公司>，授权编号：<NT220402151538>，代码指纹：<A.648883738.885>，技术对接人微信：<ID: Lingmuziyi>】
// 【授权寄送：<收件：李先生、地址：南宁市科园西十路11号国电智能大厦1101F、电话：17736659550、邮箱：yingshashou@vip.qq.com>】
//
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
//
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.eva.framework.dbpool;

/**
 * 针对特定数据库的相关实用方法.<br>
 * 本类里的所有实用方法都是据 {@link DBShell#DB_TYPE}来获知哪种数据库类型的，换句话说要设置哪种DB类型
 * 只要去DBShell中设置 DBShell#DB_TYPE即可.
 *
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 * @see DBShell#DB_TYPE
 */
public class DBDepend {
    /**
     * Oracle date pattern：yyyy-mm
     */
    public static final String SQL_ORACLE$DATE$PATTERN_YYYY$MM = "\'yyyy-mm\'";
    /**
     * Oracle date pattern：yyyy-mm-dd
     */
    public static final String SQL_ORACLE$DATE$PATTERN_YYYY$MM$DD = "\'yyyy-mm-dd\'";
    /**
     * Oracle date pattern：hh24:mi
     */
    public static final String SQL_ORACLE$DATE$PATTERN_HH24$MI = "\'hh24:mi\'";
    /**
     * Oracle date pattern：hh24:mi:ss
     */
    public static final String SQL_ORACLE$DATE$PATTERN_HH24$MI$SS = "\'hh24:mi:ss\'";
    /**
     * Oracle date pattern：yyyy-mm-dd hh24:mi
     */
    public static final String SQL_ORACLE$DATE$PATTERN_YYYY$MM$DD_HH24$MI = "\'yyyy-mm-dd hh24:mi\'";
    /**
     * Oracle date pattern：yyyy-mm-dd hh24:mi:ss
     */
    public static final String SQL_ORACLE$DATE$PATTERN_YYYY$MM$DD_HH24$MI$SS = "\'yyyy-mm-dd hh24:mi:ss\'";

    /**
     * Oracle默认时间函数
     */
    public static final String SQL_ORACLE$DEFAULT$DATETIME$FUNC = "sysdate";
    /**
     * SQLServer默认时间函数
     */
    public static final String SQL_SQLSERVER$DEFAULT$DATETIME$FUNC = "getDate()";
    /**
     * MySQL默认时间函数
     */
    public static final String SQL_MYSQL$DEFAULT$DATETIME$FUNC = "now()";

    /**
     * Oracle NULL取值函数
     */
    public static final String SQL_ORACLE_NVL = "NVL";
    /**
     * SQLServer NULL取值函数
     */
    public static final String SQL_SQLSERVER_NVL = "ISNULL";
    /**
     * MySQL NULL取值函数
     */
    public static final String SQL_MYSQL_NVL = "IFNULL";

    /**
     * 特殊处理order by 语句.<br>
     * 目前可知的是，oralce和sql server的order by 语句对null值的处理不一样，oracle把它作为最大值处理，而sql server则相反，为了
     * 使其二者表现一致则有了本字段标明db类型，以便特殊处理各数据库，使得在处理order by时能表现一致（把null值作最小值处理）
     *
     * @param originalOrderStr 原始的未经加工的order by 语句字段片段，如:"someFieldName"
     * @return
     */
    public static String specialForOrderBy(String originalOrderStr) {
        switch (DBShell.DB_TYPE) {
            case sqlServer:
                return originalOrderStr;
            case oracle:
                return "NVL(" + originalOrderStr + ",' ')";
            default:
                return originalOrderStr;
        }
    }

    /**
     * 返回对应数据库的默认日期时间函数。
     *
     * @return
     */
    public static String getDefaultDatetimeFunc() {
        switch (DBShell.DB_TYPE) {
            case sqlServer:
                return SQL_SQLSERVER$DEFAULT$DATETIME$FUNC;
            case oracle:
                return SQL_ORACLE$DEFAULT$DATETIME$FUNC;
            case mySql:
                return SQL_MYSQL$DEFAULT$DATETIME$FUNC;
            default:
                return "undefine";
        }
    }

    /**
     * 返回NULL空值函数。
     *
     * @return
     */
    public static String getNVLFunc(String expr1, String expr2) {
        switch (DBShell.DB_TYPE) {
            case sqlServer:
                return SQL_SQLSERVER_NVL + "(" + expr1 + "," + expr2 + ")";
            case oracle:
                return SQL_ORACLE_NVL + "(" + expr1 + "," + expr2 + ")";
            case mySql:
                return SQL_MYSQL_NVL + "(" + expr1 + "," + expr2 + ")";
            default:
                return "undefine";
        }
    }

    /**
     * 返回与当前时间的时间差计算函数。
     *
     * @return
     */
    public static String getTIMEDIFF(String UNIT, String timeFieldOfTable) {
        // 通过SQL的函数计算数据库中聊天消息与当前时间的时间差
        switch (DBShell.DB_TYPE) {
            case sqlServer:
                return "DATEDIFF(" + UNIT + ", " + timeFieldOfTable + ",getDate())";
            case oracle:
                return "";// TODO 暂未实现！
            case mySql:
                return "TIMESTAMPDIFF(" + UNIT + ", " + timeFieldOfTable + ",now())";
            default:
                return "undefine";
        }
    }

//	public static String getToDateStr(String dateStr, String javaDateFormat)
//	{
//		return getToDateStr(DBShell.DB_TYPE,dateStr,javaDateFormat);
//	}
//    public static String getToDateStr(DBType dbType, String dateStr, String javaDateFormat)
//    {
//        SimpleDateFormat sdf = new SimpleDateFormat(javaDateFormat);
//        java.util.Date dt = null;
//        try{
//            dt = sdf.parse(dateStr);
//        }
//        catch(Exception ex){
//            throw new IllegalArgumentException("日期字符串与日期格式不一致.");
//        }
//        return getToDateStr(dbType, dt);
//    }
//    public static String getToDateStr(DBType dbType, java.util.Date dt)
//    {
//        long time = dt.getTime();
//        Date sdt = new Date(time);
//        Time stm = new Time(time);
//        switch(dbType)
//        {
//        	case oracle: // '1'
//        		return (new StringBuilder()).append("to_date('").append(sdt.toString())
//        		.append(" ").append(stm.toString()).append("','yyyy-MM-dd HH24:min:ss')").toString();
//
//        	case sqlServer: // '2'
//        		return (new StringBuilder()).append("'").append(sdt.toString()).append(" ")
//        		.append(stm.toString()).append("'").toString();
//        }
//        return (new StringBuilder()).append("'").append(sdt.toString()).append(" ")
//        	.append(stm.toString()).append("'").toString();
//    }
}
